//#if !defined(__Handle__)
//#include "Handle.h"
//#define __Handle__
//#endif
//
//BOOLEAN HandleCallbackWin7(
//	IN PHANDLE_TABLE_ENTRY HandleTableEntry,
//	IN HANDLE Handle,
//	IN PVOID EnumParameter
//)
//{
//	//INT3BREAKPOINT;
//
//	BOOLEAN bResult = FALSE;
//	ASSERT(EnumParameter);
//	PVOID Object =(PVOID)((HandleTableEntry->LowValue&~7) + 0x30);
//
//	if (EnumParameter != NULL)
//	{
//		PHANDLE_GRANT_ACCESS_DATA pAccess = (PHANDLE_GRANT_ACCESS_DATA)EnumParameter;
//		if (!_stricmp(PsGetProcessImageFileName((PEPROCESS)Object), "lsass.exe")) {
//			//if (Handle == (HANDLE)pAccess->hProcess)
//			//{
//			DbgBreakPoint();
//			if (ExpIsValidObjectEntry(HandleTableEntry))
//			{
//				// Update access
//				PEPROCESS PE = GetProcessByName("11.exe");
//				PEPROCESS PE2 = ExAllocatePool(NonPagedPool,0x1000);
//				(ULONG64)PE2 += 0x30;
//				memcpy((PVOID)((ULONG64)PE2- 0x30), (PVOID)((ULONG64)PE - 0x30),0x1000);
//
//
//				UCHAR fl = (*(PUCHAR)&HandleTableEntry->LowValue) & 7;
//				HandleTableEntry->LowValue = ((ULONG64)PE2 - 0x30) | fl;
//				HandleTableEntry->GrantedAccessBits = pAccess->ulAccess;
//				bResult = TRUE;
//			}
//			else
//			{
//				LOGDEBUG(pAccess->hProcess, "HandleCallback:handle is invalid")
//			}
//			//}
//		}
//	}
//
//	return bResult;
//}
//
//BOOLEAN HandleCallbackWin10(
//	IN PHANDLE_TABLE HandleTable,
//	IN PHANDLE_TABLE_ENTRY HandleTableEntry,
//	IN HANDLE Handle,
//	IN PVOID EnumParameter
//)
//{
//	
//	BOOLEAN bResult = FALSE;
//	ASSERT(EnumParameter);
//	ULONG64 Object = HandleTableEntry->ObjectPointerBits;
//	Object <<= 4;
//	Object |= 0xFFFF000000000000;
//	Object += 0x30;
//	if (EnumParameter != NULL)
//	{
//		PHANDLE_GRANT_ACCESS_DATA pAccess = (PHANDLE_GRANT_ACCESS_DATA)EnumParameter;
//		if (!_stricmp(PsGetProcessImageFileName((PEPROCESS)Object), "lsass.exe")) {
//			//if (Handle == (HANDLE)pAccess->hProcess)
//			//{
//
//				DbgBreakPoint();
//				if (ExpIsValidObjectEntry(HandleTableEntry))
//				{
//					PEPROCESS PE = GetProcessByName("11.exe");
//					PEPROCESS PE2 = ExAllocatePool(NonPagedPool, 0x1000);
//					(ULONG64)PE2 += 0x30;
//					memcpy((PVOID)((ULONG64)PE2 - 0x30), (PVOID)((ULONG64)PE - 0x30), 0x1000);
//
//					(ULONG64)PE2 -= 0x30;
//					(ULONG64)PE2 &= ~0xFFFF000000000000;
//					(ULONG64)PE2 >>= 4;
//					HandleTableEntry->ObjectPointerBits = (ULONG64)PE2;
//					// Update access
//					HandleTableEntry->GrantedAccessBits = pAccess->ulAccess;
//					bResult = TRUE;
//				}
//				else
//				{
//					LOGDEBUG(pAccess->hProcess, "HandleCallback:handle is invalid")
//				}
//			//}
//		}
//	}
//	// Release implicit locks
//	_InterlockedExchangeAdd8((char*)&HandleTableEntry->VolatileLowValue, 1);  // Set Unlocked flag to 1
//	if (HandleTable != NULL && HandleTable->HandleContentionEvent)
//		ExfUnblockPushLock(&HandleTable->HandleContentionEvent, NULL);
//
//	return bResult;
//}
//
//
//NTSTATUS PowerGrantAccess(__in PHANDLE_GRANT_ACCESS_DATA pData)
//{
//	DbgBreakPoint();
//	LOGDEBUG(PowerGrantAccess, "PowerGrantAccess Called");
//
//	
//
//	NTSTATUS status = STATUS_SUCCESS;
//	PEPROCESS pEprocess = NULL;
//	ULONG ulObjectTableOffset = 0x0;
//
//	// lookup EPROCESS
//	status = PsLookupProcessByProcessId((HANDLE)pData->ulPid, &pEprocess);
//	if (!NT_SUCCESS(status))
//		return status;
//
//	// Get kernel version
//	RTL_OSVERSIONINFOEXW stOSVersionInfo = { 0 };
//	stOSVersionInfo.dwOSVersionInfoSize = sizeof(stOSVersionInfo);
//	status = RtlGetVersion((PRTL_OSVERSIONINFOW)&stOSVersionInfo);
//	if (!NT_SUCCESS(status))
//		return status;
//
//	UNICODE_STRING usFunctionName;
//	RtlInitUnicodeString(&usFunctionName, L"ExEnumHandleTable");
//	PVOID pfnExEnumHandleTable = MmGetSystemRoutineAddress(&usFunctionName);
//	if (!pfnExEnumHandleTable)
//		return STATUS_NOT_FOUND;
//
//	ULONG ulWindowsVersion = (stOSVersionInfo.dwMajorVersion << 8) | (stOSVersionInfo.dwMinorVersion << 4) | stOSVersionInfo.wServicePackMajor;
//	switch (ulWindowsVersion)
//	{
//	case WINDOWS_7:
//	case WINDOWS_7_SP1:
//	{
//		ulObjectTableOffset = 0x200;
//		PHANDLE_TABLE pTable = *(PHANDLE_TABLE*)((PUCHAR)pEprocess + ulObjectTableOffset);
//		typfnExEnumHandleTableWin7 pfnExEnumHandleTableWin7 = pfnExEnumHandleTable;
//		BOOLEAN bFound = pfnExEnumHandleTableWin7(pTable, &HandleCallbackWin7, pData, NULL);
//		if (bFound == FALSE)
//			status = STATUS_NOT_FOUND;
//	}
//	break;
//	case WINDOWS_10:
//	case WINDOWS_10_RS1:
//	case WINDOWS_10_RS2:
//	case WINDOWS_10_RS3:
//	case WINDOWS_10_RS4:
//	{
//		ulObjectTableOffset = 0x418;
//		PHANDLE_TABLE pTable = *(PHANDLE_TABLE*)((PUCHAR)pEprocess + ulObjectTableOffset);
//		typfnExEnumHandleTableWin10 pfnExEnumHandleTableWin10 = pfnExEnumHandleTable;
//		BOOLEAN bFound = pfnExEnumHandleTableWin10(pTable, &HandleCallbackWin10, pData, NULL);
//		if (bFound == FALSE)
//			status = STATUS_NOT_FOUND;
//	}
//	break;
//	default:
//	{
//		LOGDEBUG(stOSVersionInfo.dwBuildNumber, "Unsupported System Version");
//		status = STATUS_NOT_SUPPORTED;
//	}
//	break;
//	}
//
//	if (pEprocess)
//		ObDereferenceObject(pEprocess);
//
//	return status;
//}
//
//VOID DY() {
//	
//	HANDLE_GRANT_ACCESS_DATA DA;
//	DA.ulAccess = 0X1FFFFF;
//	DA.ulPid= GetProcessId("Test.exe");
//	DA.hProcess = (HANDLE)0x4f4;
//	PowerGrantAccess(&DA);
//}